import { defineAsyncComponent } from 'vue';
import type { App } from 'vue';

// 定义组件接口信息
interface ComponentInfo {
    name: string
    component: any
    attributes: any
    options: any
}

// 组件分组标识

// 组件注册
const componentRegistry: Record<string, ComponentInfo> = {};

// 自动导入所有节点组件并导出 nodeTypes（同步组件）
const nodeTypes: Record<string, any> = {}

const componentModules = import.meta.glob('./*/index.vue', { eager: true })

Object.entries(componentModules).forEach(([path, module]) => {
  // 目录名作为 type 名
  const name = path.split('/')[1]
  nodeTypes[name] = module.default
})

export { nodeTypes }

// 自动导入
const importComponents = async () => {
    // 导入所有组件
    const componentModules = import.meta.glob('./*/index.vue', { eager: true });
    // 导入所有属性配置
    const attrModules = import.meta.glob('./*/attr.json', { eager: true });
    // 导入所有选项配置
    const optionsModules = import.meta.glob('./*/options.ts', { eager: true });

    // 遍历找到的组件
    Object.entries(componentModules).forEach(([path, module]) => {
        // 提取组件名称（目录名）
        const componentName = path.split('/')[1];

        // 获取对应的属性配置和选项配置
        const attrPath = `./${componentName}/attr.json`;
        const optionsPath = `./${componentName}/options.ts`;

        // 注册组件
        componentRegistry[componentName] = {
            name: componentName,
            component: module.default,
            attributes: attrModules[attrPath]?.default || {},
            options: optionsModules[optionsPath]?.default || {},
        };
    });
};

// 初始化加载所有组件
importComponents();

// 获取所有组件信息
export const getComponentList = () => Object.values(componentRegistry);

// 获取单个组件
export const getComponent = (name: string) => componentRegistry[name];

// 全局注册组件
// 全局注册所有组件
export const registerComponents = (app: any) => {
    Object.values(componentRegistry).forEach(info => {
        app.component(info.name, info.component);
    });
};  
